#pragma once
#include <signal.h>
#include <unistd.h>
#include <iostream>
#include <cerrno>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "logMessage.hpp"
void daemonSelf()
{
    //忽略信号以防程序崩溃导致退出
    signal(SIGPIPE, SIG_IGN); // 忽略收到SIGPIPE信号，而被操作系统终止
    signal(SIGCHLD, SIG_IGN); // 防止回收进程，导致阻塞，这里的两个信号是例子，具体用什么信号要看情况
    //使程序能够调用setpid，既使进程不再是组长
    if(fork()>0)exit(2);
    //使程序成为组长
    pid_t id = setsid();
    if(id<0)
    {
        logMessage(FATAL,"setpid error errno : %d",errno);
        exit(2);
    }
    //处理0.1.2文件描述符
    int fd = open("/dev/null",O_WRONLY);
    if(fd<0)
    {
        logMessage(FATAL,"open null error,errno : %d",errno);
        exit(2);
    }
    //将0文件描述符重定向到fd里
    //fd指向一个 会将写入到文件里的东西全部抛弃的文件
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);//打开的文件有引用计数，这里只是关闭4号文件描述符，由于该文件有0、1、2指向，所以该文件并不会被关闭
}